package MyArrayList;

import java.util.Arrays;

public class MyArrayList implements IList{

    public int[] elem;
    public  int UsedSize=0;

    public static final int DEFAULT_CAPACITY=5;

    public MyArrayList(){
        elem=new int[DEFAULT_CAPACITY];

    }


    @Override
    public boolean isNull() {

        return elem.length==UsedSize;
    }

    @Override
    public void add(int date) {

        //1.判断是不是满了满了要扩容
        if (isNull()) {
            elem=Arrays.copyOf(elem,2*elem.length);
        }
        elem[UsedSize]=date;
        UsedSize++;

    }

    @Override
    public void add(int pos, int date) {


            checkPosOfAdd(pos);
            if (isNull()) {
                elem=Arrays.copyOf(elem,2*elem.length);
            }

        for (int i=UsedSize-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        elem[pos]=date;
        UsedSize++;

    }

    private void checkPosOfAdd(int pos){

        if(pos>UsedSize||pos<0){
            throw new PosException("pos位置下标异常！"+pos);
        }
    }

    //查找当前的元素是否存在
    @Override
    public boolean contains(int Find) {

        for (int i=0;i<UsedSize;i++){

            if(elem[i]==Find){
                return true;

            }

        }
        return false;
    }

    //查找当前元素的下标
    @Override
    public int indexOf(int date) {
        for (int i=0;i<UsedSize;i++){

            if(elem[i]==date){
                return i;
            }
        }
        return -1;
    }

    @Override
    public int get(int pos) {
        //1.检查pos位置合法性
        checkPosGet(pos);
    // 2.判断数组是否为空
        if (isEmpty()) {
            throw new EmptyException("顺粗表为空");
        }
        return elem[pos];
    }
    //检查pos位置是否合法
    private void checkPosGet(int pos){

        if(pos<0||pos>=UsedSize){

            throw new GetposException("pos位置不合法"+pos);
        }

    }

    @Override
    public void set(int pos, int value) {

        //检查pos位置是否合法和是否为空
        checkPosGet(pos);
        if (isEmpty()) {

            throw new EmptyException("顺序表为空");

        }
        elem[pos]=value;

    }

    //删除表中元素
    @Override
    public void remove(int toRemove) {
        if (isEmpty()) {
            throw new EmptyException("顺序表为空不能删除！");
        }
        int index=indexOf(toRemove);
        if(index==-1){
            return;
        }

        for(int i=index;i<UsedSize-1;i++){
            elem[i]=elem[i+1];
        }
        UsedSize--;
    }

    //获取顺序表长度
    @Override
    public int size() {
        return UsedSize;
    }

    //清空顺序表防止内存泄漏
    @Override
    public void clear() {

        UsedSize=0;


    }

    @Override
    public boolean isEmpty() {
        return UsedSize==0;
    }

    @Override
    public void display() {

        for (int i = 0; i < UsedSize; i++) {

            System.out.print(elem[i]);
        }
    }
}
